package cd.cdyb.sms.service;

import cd.cdyb.sms.utils.CacheUtils;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public interface RedisService {


    /**
     * 从redis获取String类型数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return key对应value
     */
    Object vGet(CacheUtils.CacheName cacheName, String key);

    /**
     * 从redis获取String类型数据
     *
     * @param key       组成key的变量
     * @return key对应value
     */
    Object vGet(String key);


    /**
     * 获取指定缓存名称的所有String类型数据
     *
     * @param cacheName 缓存名称
     * @return value列表
     */
    List<Object> vGetAll(CacheUtils.CacheName cacheName);

    /**
     * 获取指定缓存名称的String类型数据
     *
     * @param cacheName  缓存名称
     * @param isRedisKey 是否是redis中的key true:是 false:否
     * @param keys       组成key的变量
     * @return value列表
     */
    List<Object> vMultiGet(CacheUtils.CacheName cacheName, boolean isRedisKey, String... keys);

    /**
     * 往redis中存入String类型数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param value     要存入的数据
     */
    void vPut(CacheUtils.CacheName cacheName, String key, Object value);

    /**
     * 往redis中存入String类型数据
     *
     * @param key       组成key的变量
     * @param value     要存入的数据
     */
    void vPut(String key, Object value, Integer expire);

    /**
     * 批量往redis中存入String类型数据
     *
     * @param cacheName   缓存名称
     * @param keyValueMap 要存入的数据
     */
    void vPutAll(CacheUtils.CacheName cacheName, Map<String, Object> keyValueMap);

    /**
     * 增加缓存中储存的数字值
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param value     要增加的数值
     * @return 增加后的数值
     */
    Long vIncrement(CacheUtils.CacheName cacheName, String key, Long value);

    /**
     * 增加缓存中储存的数字值
     *
     * @param key       组成key的变量
     * @param value     要增加的数值
     * @return 增加后的数值
     */
    Long vIncrement(String key, Long value);

    /**
     * 减少缓存中储存的数字值
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param value     要减少的数值
     * @return 减少后的数值
     */
    Long vDecrement(CacheUtils.CacheName cacheName, String key, Long value);

    /**
     * 往redis中存入Set类型数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param values    要存入的数据
     * @return 添加成功的数量
     */
    Long sPut(CacheUtils.CacheName cacheName, String key, Object... values);

    /**
     * 查询redis的Set类型中是否有指定对象
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return true 存在，false不存在
     */
    Boolean sExist(CacheUtils.CacheName cacheName, String key, Object value);

    /**
     * 从redis的Set类型中删除数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param values    要删除的数据
     * @return 删除成功的数量
     */
    Long sRemove(CacheUtils.CacheName cacheName, String key, Object... values);

    /**
     * 将 member元素从 source 集合移动到destination集合
     *
     * @param sourceCacheName      源缓存名称
     * @param sourceKey            组成源key的变量
     * @param destinationCacheName 目标缓存名称
     * @param destinationKey       组成目标key的变量
     * @param value                要移动的数据
     * @return 是否移动成功
     */
    Boolean sMove(CacheUtils.CacheName sourceCacheName, String sourceKey, CacheUtils.CacheName destinationCacheName, String destinationKey, Object value);

    /**
     * 查询redis的Set类型中值的数量
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return set中值的数量
     */
    Long sSize(CacheUtils.CacheName cacheName, String key);

    /**
     * 随机获取Set集合类指定的元素集合
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param count 获取数量
     * @return Set集合
     */
    List<Object> sRandomMembers(CacheUtils.CacheName cacheName, String key, Long count);


    /**
     * 查询redis的Set类型中所有数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return 数据列表
     */
    Set<Object> sGetAll(CacheUtils.CacheName cacheName, String key);

    /**
     * 无条件分页查询SortedSet中的全部数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param pageable  分页参数
     * @param isAsc     true:升序 false:降序
     * @return 成员列表
     */
    Set<Object> zGet(CacheUtils.CacheName cacheName, String key, Pageable pageable, boolean isAsc);

    /**
     * 按照分数条件分页查询SortedSet中的数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param includeMin  是否包含最小值
     * @param minScore    最小值
     * @param includeMax  是否包含最大值
     * @param maxScore    最大值
     * @param pageable  分页参数
     * @param isAsc     true:升序 false:降序
     * @return 成员列表
     */
    Set<Object> zGetByScore(CacheUtils.CacheName cacheName, String key, boolean includeMin, Double minScore, boolean includeMax, Double maxScore, Pageable pageable, boolean isAsc);

    /**
     * 获取SortedSet中所有数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param isAsc     true:升序 false:降序
     * @return 成员列表
     */
    Set<Object> zGetAll(CacheUtils.CacheName cacheName, String key, boolean isAsc);

    /**
     * 从SortedSet中获取一条数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param isAsc     true:升序 false:降序
     * @return 成员信息
     */
    Object zGetFirst(CacheUtils.CacheName cacheName, String key, boolean isAsc);

    /**
     * 往SortedSet中存入数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param value     要存入的数据
     * @param score     分值
     * @return true 添加成功， false 添加失败
     */
    Boolean zPut(CacheUtils.CacheName cacheName, String key, Object value, double score);

    /**
     * 获取SortedSet中数据数量
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return 有序集合内成员数量
     */
    Long zSize(CacheUtils.CacheName cacheName, String key);

    /**
     * 根据分值删除SortedSet中数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param minScore  开始分值
     * @param maxScore  结束分值
     */
    void zRemoveByScore(CacheUtils.CacheName cacheName, String key, double minScore, double maxScore);

    /**
     * 根据分值删除SortedSet中数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param values     值
     */
    void zRemoveByValue(CacheUtils.CacheName cacheName, String key, Object... values);

    /**
     * 往redis中存入List类型数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param values    要存入的数据
     * @return 添加成功的数量
     */
    Long lRightPush(CacheUtils.CacheName cacheName, String key, Object... values);

    /**
     * 往redis中存入List类型数据 从头填入
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param values    要存入的数据
     */
    Long lLeftPush(CacheUtils.CacheName cacheName, String key, Object... values);


    /**
     * 从redis的List类型中删除数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param values    要删除的数据
     */
    void lRemove(CacheUtils.CacheName cacheName, String key, Object... values);

    /**
     * 分页查询List中的数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param pageable  分页参数
     * @return 成员列表
     */
    List<Object> lGet(CacheUtils.CacheName cacheName, String key, Pageable pageable);

    /**
     * 从右侧批量移除
     *
     * @param cacheName 缓存名称
     * @param key 组成key的变量
     * @param count 移除数量
     * @return 数据列表
     */
    List<Object> lRightRangePop(CacheUtils.CacheName cacheName, String key, Integer count);

    /**
     * 查询List中所有数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return 成员列表
     */
    List<Object> lGetAll(CacheUtils.CacheName cacheName, String key);

    /**
     * 从列表左阻塞式弹出对象
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param timeout   阻塞时间
     * @param unit      阻塞时间单位
     * @return 取出的对象
     */
    Object lLeftBlockPop(CacheUtils.CacheName cacheName, String key, long timeout, TimeUnit unit);

    /**
     * 移除并返回列表 key 的头元素
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return 取出的对象
     */
    Object lLeftPop(CacheUtils.CacheName cacheName, String key);

    /**
     * 移除 并返回 list尾部的元素
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     */
    Object lRightPop(CacheUtils.CacheName cacheName, String key);


    /**
     * 查询List中元素数量
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return 数量
     */
    Long lSize(CacheUtils.CacheName cacheName, String key);

    /**
     * 删除key
     *
     * @param cacheName 缓存名称
     * @param keys      组成key的变量
     */
    void removeKey(CacheUtils.CacheName cacheName, String... keys);

    /**
     * 删除key
     *
     * @param keys 要删除的key
     */
    void removeKey(String... keys);

    /**
     * 检查给定key是否存在
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return true 存在， false 不存在
     */
    Boolean existsKey(CacheUtils.CacheName cacheName, String key);

    /**
     * 检查给定key是否存在
     *
     * @param key redis中key
     * @return true 存在， false 不存在
     */
    Boolean existsKey(String key);

    /**
     * 从Hash中取值
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param field     hash数据类型的键
     * @return hash数据类型的值
     */
    Object hGet(CacheUtils.CacheName cacheName, String key, String field);

    /**
     * 从Hash中取值
     *
     * @param key       组成key的变量
     * @param field     hash数据类型的键
     * @return hash数据类型的值
     */
    String hGet(String key, String field);

    /**
     * 往redis中存入Hash类型数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param field     hash数据类型的键
     * @param value     hash数据类型的值
     */
    void hPut(CacheUtils.CacheName cacheName, String key, String field, Object value);

    /**
     * 往redis中批量存入Hash类型数据
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param map       hash数据类型的键值对
     */
    void hPutAll(CacheUtils.CacheName cacheName, String key, Map<String, Object> map);

    /**
     * 哈希自增
     *
     * @param cacheName 缓存名称
     * @param key 组成key的变量
     * @param field 字段名
     * @param value 步长
     * @return 自增结果
     */
    Long hIncrement(CacheUtils.CacheName cacheName, String key, String field, Long value);


    /**
     * 从Hash中取值
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return hash数据类型的值
     */
    Map<String, Object> hGetAll(CacheUtils.CacheName cacheName, String key);

    /**
     * 查询redis的Set类型中是否有指定对象
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param field     hash数据类型的键
     * @return true 存在，false不存在
     */
    Boolean hExists(CacheUtils.CacheName cacheName, String key, String field);

    /**
     * 删除hash中的键
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @param fields    hash数据类型的键
     */
    void hRemove(CacheUtils.CacheName cacheName, String key, String... fields);

    /**
     * 查询redis的Set类型中值的数量
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return set中值的数量
     */
    Long hSize(CacheUtils.CacheName cacheName, String key);

    /**
     * 获取指定key剩余时间
     *
     * @param cacheName 缓存名称
     * @param key       组成key的变量
     * @return 剩余时间（秒）
     */
    Long getRemainSecond(CacheUtils.CacheName cacheName, String key);

}
